package com.maochd.cloud.common.redis.annotation;

import java.lang.annotation.*;

/**
 * 不支持：
 * 例：
 * 形参：(String name, String uuid, RedisLock redisLock, Map map)
 * value = "#map.uuid" （不支持）
 * value = "#redisLock" （不支持）
 * value = "map.uuid" （支持）
 * allArgs = true（支持）
 * <p>
 * 支持：
 * 例：
 * 形参：(String name, String uuid, RedisLock redisLock, Map map)
 * 单字段：value = "#name"
 * 多字段：value = "#name,#uuid"
 * 对象字段：value = "#redisLock.value"
 * 单对象: value = "$redisLock"
 * 多对象: value = "$redisLock,$map"
 * 多字段（普通字段+对象字段）：value = "#name,#redisLock.value"
 * 复杂字段： value = "name, #uuid, #redisLock.value, $redisLock, $map" -- 不带#表示不读取该字段的值，只读取本身
 * 全部形参：allArgs = true （默认）
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisLock {

    /**
     * 锁名
     *
     * @return string
     */
    String value() default "";

    /**
     * 是否把整个形参列表当成锁名
     *
     * @return boolean
     */
    boolean allArgs() default true;

    /**
     * 锁释放时间
     *
     * @return long
     */
    long leaseTime() default -1;

    /**
     * 锁等待时间
     *
     * @return long
     */
    long waitTime() default 1;

    /**
     * 自定义错误提示
     *
     * @return string
     */
    String errMsg() default "当前接口正在被其他线程访问";

    /**
     * 前置Key
     *
     * @return string
     */
    String prefix() default "redisLock:";

    /**
     * watchDog时间
     *
     * @return long
     */
    long watchDogTime() default 30000;

}
